AWS Elemental MediaStoreをAWS CLIで操作してみた 〜Object操作系コマンド編〜
はじめに
清水です。re:Invent 2017でリリースされたMedia五兄弟こと(?)AWS Media Services、本エントリではメディア最適化ストレージであるAWS Elemental MediaStoreについてAWS CLIで操作してみました。先に公開した以下のContainer操作系コマンド編に続き、Object操作系コマンドmediastore-dataについても触ってみたので本エントリにまとめてみます。
やってみた
オブジェクト操作系のコマンドはaws mediastore-dataで始まるコマンドで、以下の5つが用意されています。 (mediastore-data — AWS CLI Command Reference)
- delete-object
- describe-object
- get-object
- list-items
- put-object
それぞれのコマンドの書式、操作してみた結果をまとめます。なお本エントリではmac OS Sierra上の以下の環境で検証を行いました。
$ aws --version aws-cli/1.14.17 Python/2.7.10 Darwin/16.7.0 botocore/1.8.21
list-items
オブジェクト並びにフォルダをリストするコマンドです。--endpointでContainerのEndpointを指定し、--pathでリストするパスを指定します。
- aws mediastore-data list-items --endpoint <value> --path <value>
ContainerのEndpointについては、以下のようにコンテナ名からaws mediastore list-containersコマンドなどを用いて取得できます。
$ aws mediastore list-containers \ --query 'Containers[?Name==`MediaStoreContainer1222A`].[Endpoint]' [ [ "https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com" ] ]
--pathオプションを省略すると最上位の階層のリストを返しました。
$ aws mediastore-data list-items \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com { "Items": [ { "Type": "FOLDER", "Name": "live" } ] }
--path /liveとフォルダ名をパスで指定してみます。
$ aws mediastore-data list-items \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /live { "Items": [ { "ContentType": "video/MP2T", "Name": "myStream_240p30_00174.ts", "LastModified": 1513942825.915, "ContentLength": 747676, "ETag": "042982829513a08646cd15aa74c92ebcXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Type": "OBJECT" }, { "ContentType": "video/MP2T", "Name": "myStream_480p30_00166.ts", "LastModified": 1513942777.923, "ContentLength": 1328972, "ETag": "db128d7eaab9b93d576fd7223a586d5aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Type": "OBJECT" }, <以下、出力割愛>
describe-object
オブジェクトのヘッダー情報の詳細を表示するコマンドです。list-itemsと同様、--endpointでContainerのEndpointを指定し、--pathで詳細表示するオブジェクトのパスを指定します。
- aws mediastore-data describe-object --endpoint <value> --path <value>
$ aws mediastore-data describe-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /live/myStream_480p30_00166.ts { "LastModified": "Fri, 22 Dec 2017 11:39:37 GMT", "ContentLength": "1328972", "ETag": "db128d7eaab9b93d576fd7223a586d5aXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ContentType": "video/MP2T" }
get-object
オブジェクトをダウンロードするコマンドになります。ダウンロードにはオブジェクトへのパス情報が必要です。
- aws mediastore-data --endpoint <value> --path <value> [--range <value>] <outfile>
/live/myStream.m3u8というファイルをダウンロードしてみます。
$ aws mediastore-data describe-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /live/myStream.m3u8 { "ContentType": "application/vnd.apple.mpegurl", "LastModified": "Fri, 22 Dec 2017 11:23:20 GMT", "ContentLength": "748", "ETag": "91e2b9b3dc86d54b69f873d6241168c8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "CacheControl": "max-age=3" }
$ aws mediastore-data get-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /live/myStream.m3u8 \ myStream.m3u8 { "ContentType": "application/vnd.apple.mpegurl", "LastModified": "Fri, 22 Dec 2017 11:23:20 GMT", "ContentLength": "748", "ETag": "91e2b9b3dc86d54b69f873d6241168c8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "CacheControl": "max-age=3", "StatusCode": 200 }
ダウンロードできたか確認してみます。
$ ls -l | grep myStream.m3u8 -rw-r--r-- 1 shimizu.toshiya staff 748 1 9 18:14 myStream.m3u8
$ cat myStream.m3u8 #EXTM3U #EXT-X-VERSION:3 #EXT-X-INDEPENDENT-SEGMENTS #EXT-X-STREAM-INF:BANDWIDTH=5640800,AVERAGE-BANDWIDTH=5640800,CODECS="avc1.640032,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO" myStream_1080p30.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=3440800,AVERAGE-BANDWIDTH=3440800,CODECS="avc1.64001f,mp4a.40.2",RESOLUTION=1280x720,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO" myStream_720p30.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1861200,AVERAGE-BANDWIDTH=1861200,CODECS="avc1.77.30,mp4a.40.2",RESOLUTION=640x480,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO" myStream_480p30.m3u8 #EXT-X-STREAM-INF:BANDWIDTH=1036200,AVERAGE-BANDWIDTH=1036200,CODECS="avc1.4d400d,mp4a.40.2",RESOLUTION=320x240,FRAME-RATE=30.000,AUDIO="PROGRAM_AUDIO" myStream_240p30.m3u8
--rangeオプションを使うことでデータの一部のみをダウンロードすることもできます。
$ aws mediastore-data get-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /live/myStream.m3u8 \ --range "bytes=100-200" \ myStream_100-200.m3u8 { "ContentType": "application/vnd.apple.mpegurl", "LastModified": "Fri, 22 Dec 2017 11:23:20 GMT", "ContentRange": "bytes 100-200/748", "ETag": "91e2b9b3dc86d54b69f873d6241168c8XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "CacheControl": "max-age=3", "ContentLength": "101", "StatusCode": 206 }
$ ll | grep myStream -rw-r--r-- 1 shimizu.toshiya staff 748 1 9 18:14 myStream.m3u8 -rw-r--r-- 1 shimizu.toshiya staff 101 1 9 18:21 myStream_100-200.m3u8
$ cat myStream_100-200.m3u8 DWIDTH=5640800,CODECS="avc1.640032,mp4a.40.2",RESOLUTION=1920x1080,FRAME-RATE=30.000,AUDIO="PROGRAM_A
put-object
オブジェクトをアップロードするコマンドです。アップロードするコンテナのEndpoint、アップロードするパス情報が必要です。
- aws mediastore-data put-object --endpoint <value> --body <value> --path <value>
Sample1_HLS.m3u8というファイルを/awscli/Sample1_HLS.m3u8としてアップロードしてみます。
$ aws mediastore-data put-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --body Sample1_HLS.m3u8 \ --path /awscli/Sample1_HLS.m3u8 { "ContentSHA256": "1224729c047557811b3b057d993865ceXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "StorageClass": "TEMPORAL", "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }
アップロード後、describe-objectコマンドで確認をしてみます。
$ aws mediastore-data describe-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /awscli/Sample1_HLS.m3u8 { "LastModified": "Tue, 09 Jan 2018 09:38:25 GMT", "ContentLength": "225", "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "ContentType": "binary/octet-stream" }
put-objectコマンドでは--content-typeでContentTypeの指定が、また--cache-controlでCache Controlヘッダの指定ができます。
先ほどと同じファイルを/awscli/Sample1_HLS_2.m3u8というパスでアップロード、ContentTypeとCacheControlヘッダを指定してみます。
$ aws mediastore-data put-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --body Sample1_HLS.m3u8 \ --path /awscli/Sample1_HLS_2.m3u8 \ --content-type "application/vnd.apple.mpegurl" \ --cache-control "max-age=1" { "ContentSHA256": "1224729c047557811b3b057d993865ceXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "StorageClass": "TEMPORAL", "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" }
アップロード後にdescribe-objectコマンドで情報を取得してみると、指定の値が設定されていることが確認できます。
$ aws mediastore-data describe-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /awscli/Sample1_HLS_2.m3u8 { "ContentType": "application/vnd.apple.mpegurl", "LastModified": "Tue, 09 Jan 2018 09:46:04 GMT", "ContentLength": "225", "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "CacheControl": "max-age=1" }
delete-object
オブジェクトを削除するコマンドです。削除するオブジェクトが含まれるコンテナのEndpoint、削除するオブジェクトへのパス情報が実行時に必要です。
- aws mediastore-data delete-object --endpoint <value> --path <value>
先ほどput-objectコマンドでアップロードしたファイル/awscli/Sample1_HLS.m3u8を削除してみます。
$ aws mediastore-data list-items \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /awscli { "Items": [ { "ContentType": "binary/octet-stream", "Name": "Sample1_HLS.m3u8", "LastModified": 1515490705.812, "ContentLength": 225, "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Type": "OBJECT" }, { "ContentType": "application/vnd.apple.mpegurl", "Name": "Sample1_HLS_2.m3u8", "LastModified": 1515491164.531, "ContentLength": 225, "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Type": "OBJECT" } ] }
$ aws mediastore-data delete-object \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /awscli/Sample1_HLS.m3u8
コマンド実行時の出力は特にありません。list-itemsを使って/awscliフォルダのリストを取得してみると、実際にオブジェクトが削除されていることが確認できますね。
$ aws mediastore-data list-items \ --endpoint https://g3ozdxXXXXXXXX.data.mediastore.us-west-2.amazonaws.com \ --path /awscli { "Items": [ { "ContentType": "application/vnd.apple.mpegurl", "Name": "Sample1_HLS_2.m3u8", "LastModified": 1515491164.531, "ContentLength": 225, "ETag": "9e0eaac56b75c2df3ab8c75402e7490bXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "Type": "OBJECT" } ] }
まとめ
AWS Elemental MediaStoreのAWS CLIでの操作についてContainerの操作に続きObjectについても行ってみました。ObjectのAWS CLI実行にあたり個人的にハマったポイントは、--endpointでContainerのEndpointを指定する箇所になります。例えばs3apiコマンドで--bucket <バケット名>のように指定するのと同様、--container-nameみたいなオプションがあるのかなと考えていたのですが、--endpointオプションでEndpointのURLを直接指定する形式でした。ただこちらに気がついてしまえば、シンプルに使用ができるコマンド体系だなぁと感じた次第です。引き続きMedia五兄弟の他のリソースについてもAWS CLIでの操作を試してみたいと思います。